package com.sxhuayuan.parking.plugin.parking;

import java.io.UnsupportedEncodingException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;
import com.sxhuayuan.parking.exception.SystemException;
import com.sxhuayuan.parking.utils.BeanUtils;

public abstract class AbstractRequest {

	protected Logger log = LoggerFactory.getLogger(getClass());

	/**
	 * 检查请求参数内容，包括必填参数以及特殊约束
	 */
	protected void checkFields() throws SystemException {
		// check required fields
		BeanUtils.checkRequiredFields(this);
		// check other parameters
		this.checkConstraints();
	}

	/**
	 * 检查约束情况
	 */
	protected abstract void checkConstraints() throws SystemException;

	public String toJSON() {
		return JSON.toJSONString(this);
	}

	public byte[] getContentBytes(String content, String charset) {
		if (charset == null || "".equals(charset)) {
			return content.getBytes();
		}
		try {
			return content.getBytes(charset);
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);
		}
	}

	/**
	 * <pre>
	 * 检查参数，并设置签名
	 * 1、检查参数（注意：子类实现需要检查参数的而外功能时，请在调用父类的方法前进行相应判断）
	 * 2、补充系统参数，如果未传入则从配置里读取
	 * 3、生成签名，商户接口的签名方法是【字典序+&key=key】，支付接口的签名是【文档序+&access_token=xxx】，另外注册终端的签名不拼接key和access_token
	 * </pre>
	 *
	 * @param suffix
	 *            后缀
	 */
	public abstract void checkAndSign(boolean ignoreEmptyValue, boolean dictionarySort, String suffix, String secret) throws SystemException;
}
